package com.rui.shangXueTang.clue;

/**
 * @author : [锐神NO.3]
 * @version : [v1.0]
 * @className : ClueBinaryTree
 * @createTime : [2022/2/17 16:21]
 * @description : [描述该类的功能]
 */

public class ClueBinaryTree {

    private HeroNode root;

    /**
     * 当前节点的前驱节点
     */
    private HeroNode pre;

    public void setRoot(HeroNode root) {
        this.root = root;
    }

    /**
     * 把普通二叉树转线索化二叉树
     */
    public void clueNode(HeroNode node){
        //是否可以线索化
        if(node == null){
            return;
        }

        //左子树线索化
        clueNode(node.getLeft());

        //处理当前节点的前驱
        if(node.getLeft() == null){
            node.setLeft(pre);
            node.setNoLeft(1);
        }

        //处理当前节点的后继
        if(pre != null && pre.getRight() == null){
            pre.setRight(node);
            pre.setNoRight(1);
        }

        //处理完一个节点后，就需要让当前节点作为下一个节点的前驱
        pre = node;

        //右子树线索化
        clueNode(node.getRight());
    }

    /**
     * 把非线索化二叉树转换为线索化二叉树
     */
    public void clueNode(){
        this.clueNode(root);
    }

    /**
     * 遍历线索化二叉树
     */
    public void clueList(){
        //临时节点
        HeroNode temp = root;

        while (temp != null){
            //向左查询头节点
            while (temp.getNoLeft() == 0){
                temp = temp.getLeft();
            }
            System.out.println(temp);

            //向右查询头节点
            while (temp.getNoRight() == 1){
                temp = temp.getRight();
                System.out.println(temp);
            }
            temp = temp.getRight();
        }
    }
}
